* move $wgProfiler init to Setup.php
authorDomas Mituzas <midom@users.mediawiki.org>
Sat, 24 Dec 2005 13:41:05 +0000 (13:41 +0000)
committerDomas Mituzas <midom@users.mediawiki.org>
Sat, 24 Dec 2005 13:41:05 +0000 (13:41 +0000)
* allow specifying different profiler types
* add ProfilerSimple (that for now just builds in-memory profiling structure,
  may be extended to write it somewhere)

includes/DefaultSettings.php
includes/ProfilerSimple.php [new file with mode: 0755]
includes/Profiling.php
includes/Setup.php

index dcd9c51..e875cc4 100644 (file)
@@ -1053,6 +1053,8 @@ $wgProfileToDatabase = false;
 $wgProfileSampleRate = 1;
 /** If true, print a raw call tree instead of per-function report */
 $wgProfileCallTree = false;
+/** If not empty, specifies profiler type to load */
+$wgProfilerType = '';
 
 /** Detects non-matching wfProfileIn/wfProfileOut calls */
 $wgDebugProfiling = false;
diff --git a/includes/ProfilerSimple.php b/includes/ProfilerSimple.php
new file mode 100755 (executable)
index 0000000..5a7c8b9
--- /dev/null
@@ -0,0 +1,70 @@
+<?php 
+/**
+ * Simple profiler base class
+ * @package MediaWiki
+ */
+
+/**
+ * @todo document
+ * @package MediaWiki
+ */
+class ProfilerSimple extends Profiler {
+       function profileIn($functionname) {
+               global $wgDebugFunctionEntry;
+               if ($wgDebugFunctionEntry && function_exists('wfDebug')) {
+                       wfDebug(str_repeat(' ', count($this->mWorkStack)).'Entering '.$functionname."\n");
+               }
+               $this->mWorkStack[] = array($functionname, count( $this->mWorkStack ), $this->getTime(), $this->getCpuTime());
+       }
+
+       function profileOut($functionname) {
+               $memory = memory_get_usage();
+
+               global $wgDebugFunctionEntry;
+
+               if ($wgDebugFunctionEntry && function_exists('wfDebug')) {
+                       wfDebug(str_repeat(' ', count($this->mWorkStack) - 1).'Exiting '.$functionname."\n");
+               }
+
+               list($ofname,$ocount,$ortime,$octime) = array_pop($this->mWorkStack);
+
+               if (!$ofname) {
+                       wfDebug("Profiling error: $functionname\n");
+               } else {
+                       if ($functionname == 'close') {
+                               $message = "Profile section ended by close(): {$ofname}";
+                               wfDebug( "$message\n" );
+                       }
+                       elseif ($ofname != $functionname) {
+                               $message = "Profiling error: in({$ofname}), out($functionname)";
+                               wfDebug( "$message\n" );
+                       }
+                       $entry =& $this->mCollated[$functionname];
+                       
+                       $elapsedcpu = $this->getCpuTime() - $octime;
+                       $elapsedreal = $this->getTime() - $ortime;
+
+                       $entry['cpu'] += $elapsedcpu;
+                       $entry['cpu_sq'] += $elapsedcpu*$elapsedcpu;
+                       $entry['real'] += $elapsedreal;
+                       $entry['real_sq'] += $elapsedreal*$elapsedreal;
+                       $entry['count']++;
+                               
+               }
+       }
+
+       function getFunctionReport() {          
+               /* Implement in output subclasses */
+       }
+
+       function getCpuTime() {
+               $ru=getrusage();
+               return ($ru['ru_utime.tv_sec']+$ru['ru_stime.tv_sec']+($ru['ru_utime.tv_usec']+$ru['ru_stime.tv_usec'])*1e-6);
+       }
+
+       function getTime() {
+               list($a,$b)=explode(" ",microtime());
+               return (float)($a+$b);
+       }
+}
+?>
index 6dc007c..92e1565 100755 (executable)
@@ -353,6 +353,4 @@ class Profiler {
 
 }
 
-$wgProfiler = new Profiler();
-
 ?>
index 881c5b8..a77f853 100644 (file)
@@ -26,6 +26,13 @@ if( !isset( $wgProfiling ) )
 
 if ( $wgProfiling and (0 == rand() % $wgProfileSampleRate ) ) {
        require_once( 'Profiling.php' );
+       if ($wgProfilerType == "") {
+               $wgProfiler = new Profiler();
+       } else {
+               $prclass="Profiler{$wgProfilerType}";
+               require_once( $prclass.".php" );
+               $wgProfiler = new $prclass();
+       }
 } else {
        function wfProfileIn( $fn = '' ) {
                global $hackwhere, $wgDBname;